import 'package:flutter/material.dart';
import 'dart:typed_data';

import 'location_model.dart';

enum MapClassType { gaode, google }

/// 声明地图公共接口
abstract class MapBase {
  /// 地图宽度
  double? mapWidth;

  /// 地图高度
  double? mapHeight;

  /// 轨迹线颜色
  Color polylineColor = Colors.orange;

  /// 是否显示比例尺（仅高德地图可用）
  bool scaleEnabled = false;

  /// 是否显示指南针
  bool compassEnabled = false;

  /// 手势开关
  bool gesturesEnabled = true;

  /// 可视区域指向的方向，以角度为单位，从正北向逆时针方向计算，从0 度到360 度。
  double bearing = 0;

  /// 目标可视区域的倾斜度，以角度为单位。范围从0到360度
  double tilt = 30;

  /// 目标可视区域的缩放级别
  double zoom = 15;

  /// 重复定位
  bool? locationRepeat;

  // 获取地图类型
  MapClassType getMapType();

  /// 建议在APP首次启动或者进行弹窗进行隐私声明时，根据用户设置，在创建地图时设置privacyStatement属性
  /// locationCallback:定位回调
  /// enableGestureRecognizers:是否允许在Listview中响应地图手势
  void initMapConfig(String androidKey, String iosKey,
      {bool? hasContains,
      bool? hasShow,
      bool? hasAgree,
      LatLngCommon? latlng,
      LocationCallback? locationCallback,
      LocationModelCallback? locationModelCallback});

  /// 创建地图
  /// onMapCallback:地图创建成功回调
  /// width:地图宽度
  /// height:地图高度
  Widget buildMap(
    BuildContext context,
    MapCreatedSuccess? onMapCallback, {
    double? width,
    double? height,
    bool enableGestureRecognizers = false,
  });

  /// 生成截图
  Future<Uint8List?> takeSnapshot();

  /// 开始定位（开启监听）
  /// repeat: 默认重复定位
  void startLocation({bool? repeat});

  /// 停止定位
  void stopLocation();

  /// 销毁定位
  void destroy();

  /// 改变地图中心点
  /// latlng:中心点位置，如果为null则移到当前位置
  /// animated:动画（仅支持高德地图）
  void movePosition(LatLngCommon? latlng, bool animated);

  /// 初始化当前位置标记点
  /// showInfoWindow:是否显示气泡
  /// infoWindowTitle:气泡显示内容
  /// imageAsset:icon图片
  /// onTap:点击回调
  Future<bool>? initCurrMarker(BuildContext context, bool showInfoWindow,
      String infoWindowTitle, String imageAsset, void Function(String)? onTap);

  // /// 添加当前位置标记点【需调用setState】
  // void addCurrMarker();

  /// 修改当前位置标记点【需调用setState】
  void updateCurrMarker();

  void clearMarkers({String? id});

  /// 创建新标记点【创建完成后需调用setState】
  /// showInfoWindow，点击是否显示气泡
  /// infoWindowTitle: 点击弹出的气泡内容
  /// imageAsset: 图片
  Future addMarker(
    BuildContext context,
    LatLngCommon latlng,
    bool showInfoWindow,
    String infoWindowTitle,
    String imageAsset,
    void Function(String)? onTap, {
    double rotation = 0.0,
    void Function(String)? callbackMarkId,
  });

  // /// 添加marker【需调用setState】
  // void _addMarker(Marker marker) async {
  //   _initMarkerMap[marker.id] = marker;
  // }

  /// 添加轨迹线
  void initLine(BuildContext context, List<LatLngCommon> latlngList,
      double width, void Function(String) onTap);

  // 逆地理编码
  Future<String> getGeocodeAddress(LatLngCommon latlng);
}

/// 自定义经纬度坐标对象
class LatLngCommon {
  /// 根据纬度[latitude]和经度[longitude]创建经纬度对象
  ///
  /// [latitude]取值范围 [-90.0,90.0].
  ///
  /// [latitude]取值范围 [-180.0,179.0]
  const LatLngCommon(double latitude, double longitude)
      : latitude =
            (latitude < -90.0 ? -90.0 : (90.0 < latitude ? 90.0 : latitude)),
        longitude = (longitude + 180.0) % 360.0 - 180.0;

  /// 纬度
  final double latitude;

  /// 经度
  final double longitude;

  dynamic toJson() {
    return <double>[latitude, longitude];
  }
}

/// 地图创建完成回调
typedef void MapCreatedSuccess(int mapType);

/// 实时定位回调
typedef void LocationModelCallback(LocationModel locationModel);
typedef void LocationCallback(LatLngCommon location);
